package com.zw.a.basic.a15.demo03_reflect;

import java.lang.reflect.Method;

//案例: 反射获取成员方法并使用.
/*
    Method 单词的意思就是: 方法

    反射获取成员方法涉及到的API, 以下全部都是Class类中的方法
        public Method getMethod(String name, Class... params);     根据传入的方法名, 获取其对应的成员方法对象,  只能获取公共的.
        public Method[] getMethods();             获取指定类中所有的成员方法对象, 只能获取公共的.

        public Method getDeclaredMethod(String name, Class... params);  根据传入的方法名, 获取其对应的成员方法对象(包括私有)
            这个方法要掌握

        public Method[] getDeclaredMethods();           获取指定类中所有的成员方法对象(包括私有)

    获取成员方法的目的:
       就是为了调用该方法, 且反射能越过泛型检查, 一些在编译期搞不定的事儿挪到运行时就可以搞定.
 */
public class Demo07 {
    public static void main(String[] args) throws Exception{
        //需求1: 获取公共的 成员方法.
        //method01();

        //需求2: 获取公共的 所有成员方法.
        //自己写

        //需求3: 获取私有的 成员方法.
        //method03();

        //需求4: 获取所有的成员方法, 包括私有.
        //method04();
    }

    public static void method03() throws ClassNotFoundException, NoSuchMethodException {
        //1. 获取该类的字节码文件对象.
        Class<?> clazz = Class.forName("com.itheima.pojo.Student");
        //2. 获取指定的成员方法
        Method method = clazz.getDeclaredMethod("show2");
        //3. 打印方法对象
        System.out.println(method);
    }

    public static void method04() throws ClassNotFoundException {
        //1. 获取该类的字节码文件对象.
        Class<?> clazz = Class.forName("com.itheima.pojo.Student");
        //2. 获取指定的成员方法
        Method[] methods = clazz.getDeclaredMethods();
        //3. 打印方法对象
        for (Method method : methods) {
            System.out.println(method);
        }
    }

    public static void method01() throws ClassNotFoundException, NoSuchMethodException {
        //1. 获取该类的字节码文件对象.
        Class<?> clazz = Class.forName("com.itheima.pojo.Student");
        //2. 获取指定的成员方法
        Method method = clazz.getMethod("show1");
        //3. 打印方法对象
        System.out.println(method);
    }
}
